package cn.doitedu.jvm.mem;

/**
 * 而JDK 7（以及部分其他虚拟机，例如JRockit）的intern()方法实现就不需要再拷贝字符串的实例到永久代了，
 * 既然字符串常量池已经移到Java堆中，那只需要在常量池里记录一下首次出现的实例引用即可，
 * 因此intern()返回的引用和由StringBuilder创建的那个字符串实例就是同一个。
 *
 * 而对str2比较返 回false，这是因为“java”[2]这个字符串在执行String-Builder.toString()之前就已经出现过了，
 * 字符串常量 池中已经有它的引用，不符合intern()方法要求“首次遇到”的原则，“计算机软件”这个字符串则是首次 出现的，
 * 因此结果返回true。
 */
public class InternDemo {
    public static void main(String[] args) {
        String s1 = new StringBuilder().append("ja").append("va").toString();
        // false
        System.out.println(s1.intern() == s1);

        String s2 = new StringBuilder().append("vv").append("hh").toString();
        // true
        System.out.println(s2.intern() == s2);

        String s3 = new StringBuilder().append("vv").append("hh").toString();
        // true
        System.out.println(s2.intern() == s3.intern());
        // false
        System.out.println(s2 == s3);


    }
}
